package com.zhongbo.java.websocket.service.impl;

import com.zhongbo.java.websocket.model.User;
import com.zhongbo.java.websocket.service.IRedisOnlineService;
import com.zhongbo.java.websocket.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * 说明：
 *
 * @author 钟波dellNotebook
 * @since 2025年03月24日 星期一 14:11:37
 */
@Service
public class RedisOnlineServiceImpl implements IRedisOnlineService {

    // 在线用户key前缀
    private static final String ONLINE_USERS_KEY = "chat:online_users";

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    /**
     * 用户服务
     */
    @Autowired
    private IUserService userService;

    @Override
    public void loginUser(String userId) {
        User detail = userService.detail(userId);
        if(detail==null){
            return;
        }
        // 获取用户名称, 组装redis要保存的值
        // id1111::张三
        String redisValue =userId + "::" + detail.getName();
        // 将在线用户存到redis一个set里面
        redisTemplate.opsForSet().add(ONLINE_USERS_KEY, redisValue);
        // 在1天没有用户登录的时候, 清空在线用户列表; 设置key过期时间为1天
        redisTemplate.expire(ONLINE_USERS_KEY, 1, TimeUnit.DAYS);
    }

    @Override
    public void logout(String userId) {
        // redis移除指定set中的值( key为: "chat:online_users" )
        redisTemplate.opsForSet().remove(ONLINE_USERS_KEY, userId);
    }

    @Override
    public Set<String> getOnlineUser() {
        // 返回redis在线用户列表的数组
        return redisTemplate.opsForSet().members(ONLINE_USERS_KEY);
    }

}
